package com.teamone.etl.taskmanager.feign;

import com.baomidou.mybatisplus.extension.api.R;
import com.teamone.etl.taskmanager.feign.fallback.DataSourceFeignServiceFallBackImpl;
import java.util.List;
import java.util.Map;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;

/**
 @author WangZhuoRan */
@FeignClient(value = "etl-datasource",fallback = DataSourceFeignServiceFallBackImpl.class)
public interface DataSourceFeignService {

    /**
     查询所有正常状态的数据源的信息
     feign调用 datasource模块
     @return List类型 未引入(com.teamone.etl.datasource.entity.DataSource) 所以泛型为Object
     */
    @GetMapping("/getAllDataSource")
    List<Object> selectAllNotDisabled ();

    /**
     根据(DataSource)的主键id获得所有数据库的名字
     @param id (DataSource)的主键id
     @return List<String> 数据库的名字集合
     */
    @GetMapping("/getAllDataBaseByDataSourceId/{dataSourceId}")
    List<String> getAllDataBaseByDataSourceId (@PathVariable("dataSourceId") Integer id);

    /**
     根据数据库名获得所有表名
     @param id (DataSource)的主键id
     @param dataBaseName 数据库名称
     @return List<String> 表名的集合
     */
    @GetMapping("/getAllTableByDataBaseName/{dataSourceId}")
    List<String> getAllTableByDataBaseName (@PathVariable("dataSourceId") Integer id,
                                            @RequestParam("dataBaseName") String dataBaseName);

    /**
     获得列名及 注释 类型 类型长度
     @param id (DataSource)的主键id
     @param tableName 表名
     @param dataBaseName 数据库名
     @return Map<String, List<String>> 键值分别是 column/columnType/columnComment/columnTypeLength/columnIsNullable
     */
    @GetMapping("/getAllColumnByTableName/{dataSourceId}")
    Map<String, List<String>> getAllColumnByTableName (@PathVariable("dataSourceId") Integer id,
                                                       @RequestParam("tableName") String tableName,
                                                       @RequestParam("dataBaseName") String dataBaseName);

    /**
     * 执行sql语句
     * @param dataSourceId 数据源id
     * @param dataBaseName 数据库名称
     * @param tableName 表名称
     * @param sql sql语句
     * @param shouldExecuteRuleEngine 是否执行规则引擎
     * @return 结果
     */
    @GetMapping("dataSource/dataAnalysis/{dataSourceId}")
    R<Map<String,Object>> dataAnalysis(@PathVariable("dataSourceId") Integer dataSourceId,
                                       @RequestParam("dataBaseName") String dataBaseName,
                                       @RequestParam("tableName") String tableName,
                                       @RequestParam("sql") String sql,
                                       @RequestParam("shouldExecuteRuleEngine") boolean shouldExecuteRuleEngine);
}
